package com.qzsoft.system.modules.permission.group.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.qzsoft.jeemis.common.exception.RenException;
import com.qzsoft.jeemis.common.service.BaseService;
import com.qzsoft.jeemis.common.utils.ConvertUtils;
import com.qzsoft.jeemis.common.utils.TreeUtils;
import com.qzsoft.system.modules.permission.group.dao.SysGroupDao;
import com.qzsoft.system.modules.permission.group.dao.SysRoleGroupMapper;
import com.qzsoft.system.modules.permission.group.dao.SysUserGroupDao;
import com.qzsoft.system.modules.permission.group.dto.SysGroupDTO;
import com.qzsoft.system.modules.permission.group.dto.SysGroupRoleDTO;
import com.qzsoft.system.modules.permission.group.entity.SysGroupEntity;
import com.qzsoft.system.modules.permission.group.entity.SysRoleGroupEntity;
import com.qzsoft.system.modules.permission.group.entity.SysUserGroupEntity;
import com.qzsoft.system.modules.permission.group.service.SysGroupService;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 用户组信息(sys_group)表服务实现类
 */
@Service("sysGroupService")
@Log4j2
public class SysGroupServiceImpl extends BaseService implements SysGroupService {

    @Autowired
    private SysGroupDao sysGroupDao;
    @Autowired
    private SysUserGroupDao sysUserGroupDao;

    @Autowired
    private SysRoleGroupMapper v2SysRoleGroupDao;


    /**
     * 获取用户组树
     *
     * @return
     */
    @Override
    public List<SysGroupDTO> getSysGroupTree() {
        QueryWrapper<SysGroupEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("has_delete", 0);

        List<SysGroupEntity> groupEntityList = sysGroupDao.selectList(queryWrapper);
        List<SysGroupDTO> sysGroupDTOList = ConvertUtils
                .sourceToTarget(groupEntityList, SysGroupDTO.class);
        for (int i = 0; i < sysGroupDTOList.size(); i++) {
            List<SysGroupRoleDTO> roleList = sysGroupDao.selectDefaultList(sysGroupDTOList.get(i).getId());
            if (roleList != null && !roleList.isEmpty()) {
                sysGroupDTOList.get(i).setRoleList(roleList);
            }

        }
        sysGroupDTOList = TreeUtils.build(sysGroupDTOList, '0');
        return sysGroupDTOList;
    }

    @Override
    public String save(SysGroupEntity sysGroupEntity) {
        // 当父节点为空的时候则为根节点（0）
        if (StringUtils.isBlank(sysGroupEntity.getPid())) {
            sysGroupEntity.setPid("0");
        }
        // 排序
        if (sysGroupEntity.getOrderId() == null) {
            // 获取最大排序
            Integer maxSort = null;
            if (StringUtils.isNotBlank(sysGroupEntity.getPid())) {
                maxSort = sysGroupDao.selectMaxOrderId(sysGroupEntity.getPid());
            }
            if (maxSort != null) {
                sysGroupEntity.setOrderId(maxSort + 1);
            } else {
                sysGroupEntity.setOrderId(0);
            }
        }

        // 判断分组名是否重复
        QueryWrapper<SysGroupEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("has_delete", 0).eq("name", sysGroupEntity.getName());
        if (sysGroupDao.selectCount(queryWrapper) > 0) {
            throw new RenException("分组名已存在");
        }

        // 保存分组数据
        sysGroupEntity.setHasDelete(0);
        int result = sysGroupDao.insert(sysGroupEntity);
        if (result <= 0) {
            throw new RenException("角色分组添加失败");
        }
        return sysGroupEntity.getId();
    }

    @Override
    public void saveUserAndGroup(Long id, List<SysGroupDTO> sysGroupDTOList) {


        //先删除机构用户关系
        deleteByUserIds(new Long[]{id});

        //用户没有一个机构的情况
        if (CollUtil.isEmpty(sysGroupDTOList)) {
            return;
        }

        List<SysGroupDTO> listAllDistinct = sysGroupDTOList.stream().distinct().collect(Collectors.toList());
        //保存用户机构关系
        for (SysGroupDTO sudd : listAllDistinct) {
            SysUserGroupEntity sysUserGroupEntity = new SysUserGroupEntity();
            sysUserGroupEntity.setGroupId(sudd.getId());
            sysUserGroupEntity.setUserId(id);
            sysUserGroupEntity.setHasDelete(0);
            //保存
            sysUserGroupDao.insert(sysUserGroupEntity);
        }


    }

    public void deleteByUserIds(Long[] userIds) {
        SysUserGroupEntity entity = new SysUserGroupEntity();
        UpdateWrapper<SysUserGroupEntity> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("has_delete", 1);
        updateWrapper.in("user_id", userIds);
        sysUserGroupDao.update(entity, updateWrapper);
    }


    /**
     * 根据ID查询用户分组信息
     *
     * @param id
     * @return
     */
    @Override
    public SysGroupEntity get(String id) {
        SysGroupEntity sysGroupEntity = sysGroupDao.selectById(id);
//        // 如无需代码翻译请屏蔽这句话 提高速度
//        entity = ConvertDictUtils.formatDicData(entity);
        return sysGroupEntity;
    }

    /**
     * 更新分组
     *
     * @param dto
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String update(SysGroupDTO dto) {
        // 根据ID获取分组信息
        SysGroupEntity entity = sysGroupDao.selectById(dto.getId());
        // 分组名称
        entity.setName(dto.getName());
        // 叶子节点
        entity.setHasLeaf(dto.getHasLeaf());
        // 备注
        entity.setRemark(dto.getRemark());
        //更新角色
        int result = sysGroupDao.updateById(entity);
        if (result <= 0) {
            throw new RenException("角色分组更新失败");
        }
        return dto.getId();
    }

    /**
     * 删除分组
     *
     * @param id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(String id) {
        // 判断分组下面是否有子分组
        QueryWrapper<SysGroupEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("has_delete", 0);
        queryWrapper.eq("pid", id);
        if (sysGroupDao.selectCount(queryWrapper) > 0) {
            throw (new RenException("请先删除子分组"));
        }

        // 判断分组下面是否有角色
        QueryWrapper<SysRoleGroupEntity> getRoleWrapper = new QueryWrapper<>();
        getRoleWrapper.eq("group_id", id);
        if (v2SysRoleGroupDao.selectCount(getRoleWrapper) > 0) {
            throw (new RenException("请先删除此分组下角色信息"));
        }

        // 删除分组
        UpdateWrapper<SysGroupEntity> updateWrapper = new UpdateWrapper<>();
        updateWrapper.in("id", id).set("has_delete", "1");
        sysGroupDao.update(new SysGroupEntity(), updateWrapper);
    }

}